<?php
/**
 * str_replace的变种，
 *
 * @param string $search
 * @param string $replace
 * @param string $subject
 * @param int $limit
 * @return mixed
 */
function str_replace_limit($search, $replace, $subject, $limit = -1)
{
    if (is_array($search)) {
        foreach ($search as $k => $v) {
            $search[$k] = '`' . preg_quote($search[$k], '`') . '`';
        }
    } else {
        $search = '`' . preg_quote($search, '`') . '`';
    }
    return preg_replace($search, $replace, $subject, $limit);
}


/**
 * 创建文件夹【安全方式】
 * @param string $dir
 * @param string $mode
 * @return boolean 是否创建成功
 */
function mkdirs($dir, $mode = 0755)
{
    if (is_dir($dir) || @mkdir($dir, $mode))
        return TRUE;
    if (!mkdirs(dirname($dir), $mode))
        return FALSE;
    return @mkdir($dir, $mode);
}


// Only validates empty or completely associative arrays
function is_assoc($arr)
{
    return (is_array($arr) && count(array_filter(array_keys($arr), 'is_string')) == count($arr));
}

/**
 * 创建实例
 * @param $clzClass
 * @param array $initParam
 * @return mixed
 * @throws Exception
 * @throws Throwable
 */
function newInstance($clzClass, array $initParam = array())
{
    // 查看类是不是存在
    try {
        $class = new ReflectionClass($clzClass);
        // 初始化类
        $instance = $class->newInstanceArgs($initParam);
        //
        return $instance;
    } catch (Throwable $e) {
        throw $e;
    }
}

/**
 * 反射调用
 * @param $clzClass
 * @param array $initParam
 * @param $method
 * @param array $methodParam
 * @return mixed
 * @throws Exception
 * @throws Throwable
 */
function invokeMethod($clzClass, array $initParam = array(), $method, array $methodParam = array())
{
    // 查看类是不是存在
    try {
        // 初始化类
        $instance = newInstance($clzClass,$initParam);

        // 反向代理
        $fun = new ReflectionMethod($clzClass, $method);
        return $fun->invokeArgs($instance, $methodParam);
    } catch (Throwable $e) {
        throw $e;
    }
}
